package com.yuandian.management.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuandian.api.management.entity.ConfMpInternalOrganization;
import com.yuandian.api.management.entity.ConfMpOrg;
import com.yuandian.api.management.po.ConfMpOrganizationParams;
import com.yuandian.bpm.common.core.util.R;
import com.yuandian.management.mapper.ConfMpInternalOrganizationMapper;
import com.yuandian.management.service.ConfMpInternalOrganizationService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 中台监控-内部机构应用配置表-Service实现
 * @author zfsn
 * @date 2023-4-20
 */
@Service
public class ConfMpInternalOrganizationServiceImpl extends ServiceImpl<ConfMpInternalOrganizationMapper, ConfMpInternalOrganization>
		implements ConfMpInternalOrganizationService {

	/**
	 * 通过唯一性编码组合获取内部机构应用
	 * @param orgCode 单位编码
	 * @param departmentCode 部门编码
	 * @param appCode 应用编码
	 * @return 单位配置实体
	 */
	private ConfMpInternalOrganization getByUniqueCode(String orgCode, String departmentCode, String appCode) {
		return lambdaQuery().eq(ConfMpInternalOrganization::getOrgCode, orgCode)
				.eq(ConfMpInternalOrganization::getDepartmentCode, departmentCode)
				.eq(ConfMpInternalOrganization::getAppCode, appCode).one();
	}

	/**
	 * 分页查询内部机构应用
	 * @param params 中台监控-内部机构应用配置请求参数
	 * @return 通用返回对象
	 */
	@Override
	public R<Page<ConfMpInternalOrganization>> internalPage(ConfMpOrganizationParams<ConfMpInternalOrganization> params) {
		Page<ConfMpInternalOrganization> page = Page.of(params.getCurrent(), params.getSize());
		page.addOrder(params.orders()).orders().forEach(orderItem -> orderItem.setColumn(StrUtil.toUnderlineCase(orderItem.getColumn())));
		return R.ok(lambdaQuery()
				.in(CollUtil.isNotEmpty(params.getOrgCodeList()), ConfMpInternalOrganization::getOrgCode, params.getOrgCodeList())
				.eq(params.getOrgType() != null, ConfMpInternalOrganization::getOrgType, params.getOrgType())
				.like(StrUtil.isNotBlank(params.getOrgName()), ConfMpInternalOrganization::getOrgName, params.getOrgName())
				.in(CollUtil.isNotEmpty(params.getDepartmentCodeList()), ConfMpInternalOrganization::getDepartmentCode, params.getDepartmentCodeList())
				.in(CollUtil.isNotEmpty(params.getAppCodeList()), ConfMpInternalOrganization::getAppCode, params.getAppCodeList())
				.page(page));
	}

	/**
	 * 新增内部机构应用
	 * @param params 中台监控-内部机构应用配置请求参数
	 * @return 通用返回对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public R<Boolean> internalSave(ConfMpOrganizationParams<ConfMpInternalOrganization> params) {
		// 1、校验编码组合唯一性
		if (ObjectUtil.isNotNull(getByUniqueCode(
				params.getOrgCode(), params.getDepartmentCode(), params.getAppCode()))) {
			return R.failed("新增失败，已存在相同的单位编码 + 部门编码 + 应用编码！");
		}
		// 2、新增内部单位配置
		ConfMpInternalOrganization confMpInternalOrganization = BeanUtil.copyProperties(params, ConfMpInternalOrganization.class);
		save(confMpInternalOrganization);
		return R.ok(Boolean.TRUE, "新增成功");
	}

	/**
	 * 主键修改内部机构应用
	 * @param params 中台监控-内部机构应用配置请求参数
	 * @return 通用返回对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public R<Boolean> internalUpdateById(ConfMpOrganizationParams<ConfMpInternalOrganization> params) {
		// 1、校验请求参数
		Integer id = params.getId();
		if (id == null) {
			return R.failed("更新失败，单位id不能为空！");
		}
		// 2、通过id获取单位配置
		ConfMpInternalOrganization organization = getById(id);
		// 3、校验该配置是否存在
		if (ObjectUtil.isNull(organization)) {
			return R.failed("更新失败，不存在该单位配置！");
		}
		// 4、校验编码组合的唯一性
		ConfMpInternalOrganization orgByUniqueCode = getByUniqueCode(
				params.getOrgCode(), params.getDepartmentCode(), params.getAppCode());
		if (ObjectUtil.isNotNull(orgByUniqueCode) && !id.equals(orgByUniqueCode.getId())) {
			return R.failed("更新失败，已存在相同的单位编码 + 部门编码 + 应用编码！");
		}
		// 5、更新单位配置
		BeanUtil.copyProperties(params, organization);
		updateById(organization);
		return R.ok(Boolean.TRUE, "更新成功");
	}

	/**
	 * 主键删除内部机构应用
	 * @param idList 主键集合
	 * @return 通用返回对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public R<Boolean> internalRemoveByIds(List<Integer> idList) {
		// 1、校验请求参数
		if (CollUtil.isEmpty(idList)) {
			return R.failed("删除失败，主键集合不能为空");
		}
		// 2、删除单位配置
		removeByIds(idList);
		return R.ok(Boolean.TRUE, "删除成功");
	}
}